home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / util / libs / graphics3d.lha / src / example / gad.h < prev    next >
Encoding:
Text File  |  1998-01-29  |  16.0 KB  |  553 lines

  1. /****************************************************
  2.  ** Routin per la gestione semplificata di eventi  **
  3.  ** dai gadget , menu', mouse e tastiera, in stile **
  4.  ** 2.0 il tutto scritto per il linguaggio E.      **
  5.  ** (c) 1994,1995 BIANCA HARD&SOFT Vers:1.09       **
  6.  ****************************************************/
  7.  
  8. MODULE 'graphics','gadtools','libraries/gadtools','intuition/intuition',
  9. 'intuition/screens','intuition/gadgetclass','graphics/text',
  10. 'keymap','devices/inputevent','intuition','exec/lists','exec/nodes',
  11. 'graphics/gfx','graphics/rastport'
  12.  
  13. /** COSTANTI DI USO INTERNO ED ESTERNO **/
  14.  
  15. ENUM STRINGA,NUMERO,TASTO,TASTO_MX,TESTO,CK_BOX,POTX,POTY,LIST_VW
  16.  
  17. CONST F1=$130,F2=$131,F3=$132,F4=$133
  18. CONST F6=$135,F7=$136,F8=$137,F9=$138
  19. CONST F10=$139
  20.  
  21. CONST CSU=$238,CGIU=$232
  22. CONST CSI=$234,CDE=$236
  23.  
  24. CONST HLP=$237
  25.  
  26. /** COSTANTI DI USO ESCLUSIVAMENTE INTERNO **/
  27.  
  28. CONST N_ADD=20
  29. CONST UGAD=8
  30.  
  31. /* strutture globali di uso esclusivamente interno */
  32. /*** !! NON USARLE MAI ESTERNAMENTE !!! ***/
  33.  
  34. OBJECT ugadget
  35.    scr:LONG,        /* puntatore a screen usato per i gadget */
  36.    fpub:LONG,       /* flag che indica se schermo pubblico (0=no 1=si) */
  37.    visual:LONG,     /* puntatore a struttura di info sugli screen */
  38.    menu:LONG,       /* puntatore a struttura menu */
  39.    offy:LONG,       /* offset per evitare bordi e margini */
  40.    pgad:LONG,       /* puntatore a struttura gadget precedente */
  41.    fgad:LONG,       /* puntatore a primo gadget */
  42.    wind:LONG,       /* puntatore a finestra con gadget */
  43.    bmp:LONG,        /* punt. a bitmap finestra se superbitmap (NULL se no)*/ 
  44.    tattr:LONG,      /* puntatore a font usato */
  45.    ortp:LONG,       /* vecchio valore variabile stdrast */
  46.    class:LONG,      /* classe dell'evento registrato */
  47.    code:LONG,       /* codice evento registrato */
  48.    qual:LONG,       /* qualificatore evento registrato */
  49.    iadd:LONG        /* puntatore a struttura interessata dall'evento */
  50. ENDOBJECT
  51.  
  52. /* fine. */
  53.  
  54. /**********************************************
  55.  **********************************************
  56.  *** !!! N O T A !!!                        ***
  57.  *** Il primo parametro di ogni funzione,   ***
  58.  *** (eccetto start_e()) deve essere il     ***
  59.  *** valore >0 ritornato da start_e().      ***
  60.  **********************************************
  61.  **********************************************/
  62.  
  63. /***********************************************
  64.  ****  FUNZIONI DI CREAZIONE E DISTRUZIONE  ****
  65.  ***********************************************/
  66. /**************************************************
  67.  ** Inizializza tutto il necessario, va lanciato **
  68.  ** come prima cosa .                            **
  69.  *** INPUT :                                     **
  70.  ** Puntatore a screen da usare.                 **
  71.  *** OUTPUT :                                    **
  72.  ** =<0 - Codice errore.                         **
  73.  ** >0  - indirizzo struttura ugadget.           **
  74.  **************************************************/
  75. PROC start_es(scr:PTR TO screen)
  76.    DEF p:LONG
  77.    DEF p1:PTR TO screen
  78.    DEF r:PTR TO LONG
  79.    DEF r1:PTR TO textattr
  80.    DEF ugad:PTR TO ugadget
  81.  
  82.    r1:=New(SIZEOF textattr)
  83.    IF r1=NIL THEN RETURN 00
  84.    r1:=['topaz.font',8,0,0]:textattr
  85.   
  86.    r:=New((SIZEOF ugadget)+UGAD+10)
  87.    IF r=NIL THEN RETURN 00
  88.  
  89.    ugad:=r+UGAD
  90.  
  91.    IF gadtoolsbase=NIL 
  92.       IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=NIL THEN RETURN -1
  93.    ENDIF
  94.  
  95.    IF keymapbase=NIL
  96.       IF (keymapbase:=OpenLibrary('keymap.library',37))=NIL THEN RETURN -4
  97.    ENDIF
  98.  
  99.    ugad.scr:=scr
  100.    ugad.fpub:=0
  101.    IF (p:=GetVisualInfoA(ugad.scr,NIL))=NIL THEN RETURN -3
  102.  
  103.    ugad.visual:=p
  104.    p1:=ugad.scr
  105.    ugad.offy:=p1.wbortop+Int(p1.rastport+58)-10
  106.    ugad.tattr:=r1
  107. /*
  108.    ugad.tattr:=['topaz.font',8,0,0]:textattr
  109. */
  110.    ugad.ortp:=NIL /* indico rastport invariato */
  111.    ugad.pgad:=NIL /* indica gadget ancora non definiti */
  112.    ugad.menu:=NIL /* indica menu non ancora definiti */
  113.    ugad.wind:=NIL /* indica finestra non ancora definita */
  114.    ^r:=NIL        /* inizializzo valore puntatore a gadget fittizio */
  115.  
  116. ENDPROC r
  117.  
  118. /******************************************************
  119.  ** Esegue l'opposto della precedente, ovvero libera **
  120.  ** tutte le strutture necessarie.                   **
  121.  *** INPUT :                                         **
  122.  **  u - valore restituito da start_e().             **
  123.  **  f - se <>0 chiude anche le librerie aperte.     **
  124.  *** OUTPUT:                                         **
  125.  ** nessuno.                                         **
  126.  ******************************************************/
  127. PROC end(u:PTR TO LONG,f:LONG)
  128. DEF ugad:PTR TO ugadget
  129.  
  130.    IF u=NIL THEN RETURN
  131.  
  132.    ugad:=u+UGAD
  133.  
  134.    IF ugad.tattr THEN Dispose(ugad.tattr)
  135.    IF ugad.visual THEN FreeVisualInfo(ugad.visual)
  136.    IF (ugad.scr AND ugad.fpub) THEN UnlockPubScreen(NIL,ugad.scr)
  137.    IF (f AND gadtoolsbase)
  138.       CloseLibrary(gadtoolsbase)
  139.       gadtoolsbase:=NIL
  140.    ENDIF
  141.    IF (f AND keymapbase)
  142.       CloseLibrary(keymapbase)
  143.       keymapbase:=NIL
  144.    ENDIF
  145.    Dispose(u)
  146. ENDPROC
  147.  
  148. /*******************************************************
  149.  ** Apro una finestra in cui metto i gadget definiti. **
  150.  *** INPUT :                                          **
  151.  **  u    : valore restituito da start_e().           **
  152.  ** x,y   : posizione origine finestra.               **
  153.  ** dx,dy : dimensione finestra.                      **
  154.  ** titolo: puntatore a stringa titolo.               **
  155.  ** tipo  : tipo di finestra aperta ,                 **
  156.  **        bit 0 - Closegad   ; bit 1 - SizeGadget    **
  157.  **        bit 2 - Dragbar    ; bit 3 - Depthgadget   **
  158.  **        bit 4 - Gimmezerozero                      **
  159.  **        bit 5 - Superbitmap (x double buffering)   **
  160.  *** OUTPUT:                                          **
  161.  ** puntatore a finestra aperta , 00 se rilevato un   **
  162.  ** errore durante l'apertura.                        **
  163.  *******************************************************/
  164. PROC gad_w(u:PTR TO LONG,
  165.            x,y,dx,dy,titolo:PTR TO CHAR,tipo)
  166.    DEF  i ,
  167.      idcmp,
  168.        wfl
  169.    DEF  win:PTR TO window
  170.    DEF ugad:PTR TO ugadget
  171.    DEF sc:PTR TO screen
  172.    DEF bm:PTR TO bitmap
  173.    DEF bm1:PTR TO bitmap
  174.    DEF rp:PTR TO rastport
  175.  
  176.    IF u=NIL THEN RETURN 0
  177.  
  178.    ugad:=u+UGAD
  179.    IF ugad.scr=0 THEN RETURN 0
  180.  
  181.    bm:=0
  182.  
  183. /* per default la finestra rileva eventi tastiera */
  184.    idcmp:=IDCMP_REFRESHWINDOW OR IDCMP_VANILLAKEY OR IDCMP_RAWKEY
  185.  
  186.    wfl:=WFLG_SMART_REFRESH OR WFLG_ACTIVATE OR WFLG_REPORTMOUSE
  187.  
  188.    /** setto idcmp e wfl in base a tipo **/
  189.    IF (tipo AND $1)>0  /* closegadget */
  190.       wfl:=wfl OR WFLG_CLOSEGADGET
  191.       idcmp:=idcmp OR IDCMP_CLOSEWINDOW
  192.    ENDIF
  193.  
  194.    IF (tipo AND $2)>0  /* sizegadget */
  195.       wfl:=wfl OR WFLG_SIZEGADGET OR WFLG_HASZOOM
  196.       idcmp:=idcmp OR IDCMP_NEWSIZE
  197.    ENDIF
  198.  
  199.    IF (tipo AND $4)>0  /* dragbar */
  200.       wfl:=wfl OR WFLG_DRAGBAR
  201.    ENDIF
  202.  
  203.    IF (tipo AND $8)>0  /* depthgadget */
  204.       wfl:=wfl OR WFLG_DEPTHGADGET
  205.    ENDIF
  206.  
  207.    IF (tipo AND $10)>0 /* gimmezerozero, i bordi non vengono toccati */
  208.       wfl:=wfl OR WFLG_GIMMEZEROZERO
  209.    ENDIF
  210.  
  211. /*   IF ugad.scr=NIL THEN i:=1 ELSE i:=15 */
  212. /*   win:=OpenW(x,y,dx,dy,idcmp,wfl,titolo,ugad.scr,i,^u) */
  213.    IF ugad.fpub=0
  214.       win:=OpenWindowTagList(NIL,[  WA_LEFT,x,
  215.                WA_TOP,y,
  216.                WA_WIDTH,dx,
  217.                WA_HEIGHT,dy,
  218.                WA_IDCMP,idcmp,
  219.                WA_POINTER,NIL,
  220.                WA_FLAGS,wfl,
  221.                WA_TITLE,titolo,
  222.                WA_CUSTOMSCREEN,ugad.scr,
  223.                WA_GADGETS,^u,
  224.                NIL]) 
  225.    ELSE
  226.       win:=OpenWindowTagList(NIL,[  WA_LEFT,x,
  227.                WA_TOP,y,
  228.                WA_WIDTH,dx,
  229.                WA_HEIGHT,dy,
  230.                WA_IDCMP,idcmp,
  231.                WA_POINTER,NIL,
  232.                WA_FLAGS,wfl,
  233.                WA_TITLE,titolo,
  234.                WA_PUBSCREEN,ugad.scr,
  235.                WA_GADGETS,^u,
  236.                NIL]) 
  237.             
  238.    ENDIF 
  239.    IF win=NIL 
  240.     RETURN 0
  241.    ENDIF
  242.  
  243.    ugad.bmp:=NIL 
  244.  
  245.    Gt_RefreshWindow(win,NIL)
  246.  
  247.    ugad.ortp:=SetStdRast(win.rport)
  248.        /* setto nuovo rastport per le funzioni grafiche E */
  249.    ugad.wind:=win
  250. /*
  251. WriteF('win=\d\n',ugad.wind)
  252. */
  253. ENDPROC win
  254.  
  255. /***********************************************
  256.  ** chiudo la finestra e gli eventuali gadget **
  257.  *** INPUT :                                  **
  258.  **  u - valore restituito da start_e().      **
  259.  *** OUTPUT:                                  **
  260.  ** nessuno.                                  **
  261.  ***********************************************/
  262. PROC gad_cw(u:PTR TO LONG)
  263. DEF ugad:PTR TO ugadget
  264. DEF w:PTR TO window
  265. DEF rp:PTR TO rastport
  266.  
  267.    IF u=NIL THEN RETURN
  268.  
  269.    ugad:=u+UGAD
  270.    IF ugad.wind<>NIL 
  271.     w:=ugad.wind
  272.     CloseWindow(ugad.wind)   
  273.    ugad.wind:=NIL
  274.    ENDIF
  275.    IF ugad.ortp THEN 
  276.       SetStdRast(ugad.ortp) /* ripristino vecchio stdrast per le funzioni E */
  277.    IF ugad.pgad<>NIL
  278.       FreeGadgets(^u)
  279.       ugad.pgad:=NIL
  280.       ugad.fgad:=NIL
  281.    ENDIF
  282.    IF ugad.menu<>NIL
  283.       FreeMenus(ugad.menu)
  284.       ugad.menu:=NIL
  285.    ENDIF
  286. ENDPROC
  287.  
  288. /***********************************
  289.  *** FUNZIONI DI GESTIONE EVENTI ***
  290.  ***********************************/
  291. /***********************************************
  292.  ** Attesa sospensiva evento.                 **
  293.  *** INPUT :                                  **
  294.  **  u - valore restituito da start_e().      **
  295.  *** OUTPUT:                                  **
  296.  ** 0 - evento normale.                       **
  297.  ** 1 - chiusura finestra                     **
  298.  ***********************************************/
  299. PROC pause(u:PTR TO LONG)
  300. DEF ugad:PTR TO ugadget,
  301.     imsg:PTR TO intuimessage,
  302.      win:PTR TO window
  303.  
  304.    IF u=NIL THEN RETURN 1
  305.  
  306.    ugad:=u+UGAD
  307.  
  308.    win:=ugad.wind
  309.  
  310.    WHILE ((imsg:=Gt_GetIMsg(win.userport))=NIL) DO  WaitPort(win.userport)
  311.  
  312.    ugad.class:=imsg.class
  313.    ugad.code:=imsg.code
  314.    ugad.qual:=imsg.qualifier
  315.    ugad.iadd:=imsg.iaddress
  316.  
  317.    Gt_ReplyIMsg(imsg)
  318.  
  319.    IF ugad.class=IDCMP_CLOSEWINDOW THEN RETURN 01
  320.    IF ugad.class=IDCMP_REFRESHWINDOW
  321.       Gt_BeginRefresh(win)
  322.       Gt_EndRefresh(win,TRUE)
  323.    ENDIF
  324.  
  325. ENDPROC
  326.  
  327. /*** GESTIONE MOUSE E TASTIERA ***/
  328. /*************************************
  329.  ** Attivo la gestione del mouse .  **
  330.  *** INPUT :                        **
  331.  **  u - valore restituito da       **
  332.  **      start_e().                 **
  333.  *** OUTPUT:                        **
  334.  ** nessuno                         **
  335.  *************************************/
  336. PROC mouse_ON(u:PTR TO LONG)
  337. DEF ugad:PTR TO ugadget,
  338.     win:PTR TO window
  339.  
  340.    IF u=NIL THEN RETURN
  341.  
  342.    ugad:=u+UGAD
  343.    win:=ugad.wind
  344.    ModifyIDCMP(win,win.idcmpflags OR IDCMP_MOUSEBUTTONS OR IDCMP_MOUSEMOVE)
  345.  
  346. ENDPROC
  347. /*************************************
  348.  ** Disattivo la gestione del mouse.**
  349.  *** INPUT :                        **
  350.  **  u - valore restituito da       **
  351.  **      start_e().                 **
  352.  *** OUTPUT:                        **
  353.  ** nessuno                         **
  354.  *************************************/
  355. PROC mouse_OFF(u:PTR TO LONG)
  356. DEF ugad:PTR TO ugadget,
  357.     win:PTR TO window,
  358.     flg:LONG    
  359.  
  360.    IF u=NIL THEN RETURN
  361.  
  362.    ugad:=u+UGAD
  363.    win:=ugad.wind
  364.    flg:=Eor(win.idcmpflags,IDCMP_MOUSEBUTTONS)
  365.    flg:=Eor(win.idcmpflags,IDCMP_MOUSEMOVE)
  366.    ModifyIDCMP(win,flg)
  367.  
  368. ENDPROC
  369. /**********************************************
  370.  ** Restituisco valore tasto premuto.        **
  371.  *** INPUT :                                 **
  372.  ** u  - valore restituito da start.         **
  373.  *** OUTPUT:                                 **
  374.  ** 0<         - tasto non premuto.          **
  375.  ** =>0 e <255 - codice ascii tasto premuto. **
  376.  **  >255      - allora e' o tasto funzione  **
  377.  **              ($130,$131-$139) o tasto    **
  378.  **              cursore.                    **
  379.  **              ($234,$236,$238,$232)       **
  380.  **********************************************/
  381. PROC inkey(u:PTR TO LONG)
  382. DEF ugad:PTR TO ugadget
  383. DEF   ie:inputevent
  384. DEF b[80]:ARRAY 
  385. DEF   ct:LONG
  386. DEF    i:LONG
  387. DEF   es:LONG
  388.  
  389.    IF u=NIL THEN RETURN -1
  390.  
  391.    ugad:=u+UGAD
  392.    IF ugad.class = IDCMP_VANILLAKEY THEN RETURN ugad.code
  393.    IF ugad.class <> IDCMP_RAWKEY THEN RETURN -1
  394.  
  395. /*   ie.ie_class:=IECLASS_RAWKEY */
  396.    ie.class:=IECLASS_RAWKEY
  397. /*   ie.ie_subclass:=0 */
  398.    ie.subclass:=0
  399. /*   ie.ie_code:=ugad.code */
  400.    ie.code:=ugad.code
  401. /*   ie.ie_eventaddress:=ugad.iadd */
  402.    ie.prev1downcode:=ugad.iadd
  403.  
  404.    ie.qualifier:=ugad.qual
  405.  
  406.    ct:=MapRawKey(ie,b,75,0)
  407.    IF (ct=-1) OR (ct=0) THEN RETURN -1
  408.  
  409.    es:=-1
  410.  
  411.    IF b[0]=$9B          /** test se tipo riconosciuto **/
  412.       IF (ct=2)            /** test se tasti mov. cursore alto basso **/
  413.          i:=b[1]
  414.          SELECT i
  415.             CASE $41       /* su */
  416.                es:=CSU
  417.             CASE $42       /* giu */
  418.                es:=CGIU
  419.         CASE $44       /* sinistra */
  420.            es:=CSI
  421.         CASE $43       /* destra */
  422.            es:=CDE
  423.          ENDSELECT
  424.       ELSEIF (ct=3)
  425.             /** test se tasto HELP **/
  426.        IF (b[1]=$3F) AND (b[2]=$7E) 
  427.         es:=HLP    
  428.                         /** test se tasti funzione **/
  429.            ELSEIF ((b[1]>$2F) AND (b[1]<$3A)) AND (b[2]=$7E)
  430.              es:=$100+b[1]
  431.        ENDIF
  432.       ENDIF
  433.    ENDIF
  434. ENDPROC es
  435.  
  436. /**********************************************
  437.  ** Restituisco stato tasto sinistro         **
  438.  ** del mouse.                               **
  439.  *** INPUT :                                 **
  440.  ** u  - valore restituito da start.         **
  441.  *** OUTPUT:                                 **
  442.  ** 0< - tasto non premuto.                  **
  443.  ** 01 - tasto premuto.                      **
  444.  ** 02 - tasto rilasciato.                   **
  445.  **********************************************/
  446. PROC mouse(u:PTR TO LONG)
  447. DEF ugad:PTR TO ugadget,
  448.     c,es
  449.  
  450.    IF u=NIL THEN RETURN -1
  451.  
  452.    ugad:=u+UGAD
  453.    c:=ugad.code
  454.  
  455.    IF ugad.class<>IDCMP_MOUSEBUTTONS THEN RETURN -1
  456.  
  457.    SELECT c
  458.       CASE SELECTUP
  459.          es:=02
  460.       CASE SELECTDOWN
  461.          es:=01
  462.    ENDSELECT
  463.  
  464. ENDPROC es
  465.  
  466. /******************************************
  467.  ** Restituisce posizione X del mouse.   **
  468.  *** INPUT :                             **
  469.  ** u  - valore restituito da start_e(). **
  470.  *** OUTPUT:                             **
  471.  ** pos. x mouse.                        **
  472.  ******************************************/
  473. PROC mouseX(u:PTR TO LONG)
  474. DEF ugad:PTR TO ugadget
  475.  
  476.    IF u=NIL THEN RETURN -1
  477.  
  478.    ugad:=u+UGAD
  479.  
  480. ENDPROC MouseX(ugad.wind)
  481.  
  482. /******************************************
  483.  ** Restituisce posizione Y del mouse.   **
  484.  *** INPUT :                             **
  485.  ** u  - valore restituito da start_e(). **
  486.  *** OUTPUT:                             **
  487.  ** pos. y mouse.                        **
  488.  ******************************************/
  489. PROC mouseY(u:PTR TO LONG)
  490. DEF ugad:PTR TO ugadget
  491.  
  492.    IF u=NIL THEN RETURN -1
  493.  
  494.    ugad:=u+UGAD
  495.  
  496. ENDPROC MouseY(ugad.wind)
  497. /** FINE GESTIONE MOUSE E TASTIERA ***/
  498.  
  499. /************************************************
  500.  ** restituisco il puntatore al RastPort usato **
  501.  *** INPUT :                                   **
  502.  ** u  - valore restituito da start_e().       **
  503.  *** OUTPUT:                                   **
  504.  ** puntatore alla rastport usata dai gadget.   **
  505.  ** se <=0 valore non valido.                  **
  506.  ************************************************/
  507. PROC rport(u:PTR TO LONG)
  508. DEF ugad:PTR TO ugadget,
  509.     win:PTR TO window
  510.  
  511.    IF u=NIL THEN RETURN -1
  512.  
  513.    ugad:=u+UGAD
  514.    win:=ugad.wind
  515.  
  516. ENDPROC win.rport
  517.  
  518. /***************************************************
  519.  ** Disegna un rettangolo col look 3D del S.O:2.0 **
  520.  *** INPUT :                                      **
  521.  ** u     - valore restituito da start_e().       **
  522.  ** x,y   - posizione angolo alto a sinistra box. **
  523.  ** dx,dy - dimensioni box.                       **
  524.  ** tipo  - tipo rettangolo,                      **
  525.  **         0=rilievo, 1=incassato.               **
  526.  *** OUTPUT:                                      **
  527.  ** nessuno.                                      **
  528.  ***************************************************/
  529. PROC box3d(u:PTR TO LONG,x,y,dx,dy,tipo)
  530. DEF ugad:PTR TO ugadget,
  531.     win:PTR TO window,
  532.     xx,yy
  533.  
  534.    IF u=NIL THEN RETURN
  535.  
  536.    ugad:=u+UGAD
  537.    win:=ugad.wind
  538.  
  539.    xx:=x
  540.    yy:=y
  541.  
  542.    IF tipo=0
  543.       DrawBevelBoxA(win.rport,xx,yy,dx,dy,[GT_VISUALINFO,ugad.visual,NIL])
  544.    ELSE
  545.       DrawBevelBoxA(win.rport,xx,yy,dx,dy,
  546.                     [GTBB_RECESSED,1,GT_VISUALINFO,ugad.visual,NIL])
  547.    ENDIF
  548.  
  549. ENDPROC 
  550. /******  FINE FUNZIONI VARIE  ******/
  551.  
  552.  
  553.